home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / language / gemfsc18.lzh / AESSRC18.LZH / AESFUNCS / FRMMENU.C < prev    next >
C/C++ Source or Header  |  1992-04-07  |  6KB  |  213 lines

  1. /**************************************************************************
  2.  * FRMMENU.C - The frm_menu() and frm_mdo() functions.
  3.  *************************************************************************/
  4.  
  5. #include "gemfast.h"
  6. #include "frmtypes.h"
  7.  
  8. #ifndef TRUE
  9.   #define TRUE  1
  10.   #define FALSE 0
  11. #endif
  12.  
  13. #ifndef NULL
  14.   #define NULL 0L
  15. #endif
  16.  
  17. #define BLITOPTIONS (FRM_USEBLIT|FRM_MOVEABLE)
  18.  
  19. #define MU_M1_ENTRY 0
  20. #define MU_M1_EXIT  1
  21.  
  22. static void wait_buttonup()
  23. {
  24.     int dmy;
  25.     evnt_button(1,1,0,&dmy,&dmy,&dmy,&dmy);
  26. }
  27.  
  28. int frm_mdo(ctl)
  29.     register FormControl *ctl;
  30. {
  31.     int             mx;
  32.     int             my;
  33.     int             mb;
  34.     int             dmy;
  35.     int             exit_condition;
  36.     int             mouse_object;
  37.     int             watch_object;
  38.     int             selected_object;
  39.     int             oldmouse;
  40.     int             ob_flags;
  41.     int             ob_state;
  42.     GRECT           leaverect;
  43.     XMULTI          xm;
  44.     register OBJECT *ptree = ctl->ptree;
  45.  
  46.     wind_update(BEG_MCTRL);
  47.     oldmouse = graf_mouse(GRF_MSINQUIRE, NULL);
  48.  
  49.     if (ctl->options & FRM_MEXITPARENT) {
  50.         obj_clcalc(ptree, ctl->parentobj, &leaverect, NULL);
  51.     } else if (ctl->options & FRM_MEXITVICINITY) {
  52.         obj_clcalc(ptree, ctl->parentobj, &leaverect, NULL);
  53.         rc_gadjust(&leaverect, 4*gl_wchar, 2*gl_hchar);
  54.         rc_intersect(&gl_rwdesk,  &leaverect);
  55.     } else {
  56.         rc_copy(&gl_rwdesk, &leaverect);
  57.     }
  58.  
  59.     watch_object    = ctl->parentobj;
  60.     selected_object = NO_OBJECT;
  61.  
  62.     xm.mflags   = MU_M1 | MU_BUTTON;
  63.     xm.mbclicks = 1;
  64.     xm.mbmask   = 1;
  65.     xm.mbstate  = 1;
  66.     xm.mm1flags = MU_M1_ENTRY;
  67.  
  68.     if (ctl->defaultobj != NO_OBJECT) {
  69.         xm.mflags |= MU_KEYBD;
  70.     }
  71.  
  72.     do  {
  73.         exit_condition = FALSE;
  74.         obj_clcalc(ptree, watch_object, &xm.mm1rect, NULL);
  75.  
  76.         evnx_multi(&xm);
  77.         graf_mkstate(&mx, &my, &mb, &dmy);
  78.  
  79.         if ((xm.mwhich & MU_M1) && (selected_object != NO_OBJECT)) {
  80.             obj_stchange(ptree, selected_object, ~ctl->select_state,
  81.                 OBJ_CLIPDRAW, ctl->pboundrect);
  82.             selected_object = NO_OBJECT;
  83.         }
  84.  
  85.         mouse_object = objc_find(ptree, ctl->parentobj, MAX_DEPTH, mx, my);
  86.         watch_object = ctl->parentobj;
  87.         xm.mm1flags  = MU_M1_ENTRY;
  88.  
  89.         if (mouse_object == NO_OBJECT) {
  90.             if (!rc_ptinrect(&leaverect, mx, my)) {
  91.                 exit_condition = TRUE;
  92.             }
  93.         } else {
  94.             ob_flags = ptree[mouse_object].ob_flags;
  95.             ob_state = ptree[mouse_object].ob_state;
  96.             if ( (ob_flags & (SELECTABLE|EXIT|TOUCHEXIT|DEFAULT)) &&
  97.                 !(ob_state & DISABLED)) {
  98.                 selected_object = mouse_object;
  99.                 if (!(ob_flags & (EXIT|DEFAULT|TOUCHEXIT))) {
  100.                     watch_object = mouse_object;
  101.                     xm.mm1flags = MU_M1_EXIT;
  102.                     obj_stchange(ptree, mouse_object, ctl->select_state,
  103.                         OBJ_CLIPDRAW, ctl->pboundrect);
  104.                 }
  105.             }
  106.         }
  107.  
  108.         if (xm.mwhich & MU_BUTTON) {
  109.             exit_condition = TRUE;
  110.             if (selected_object != NO_OBJECT && (ob_flags & (EXIT|DEFAULT))) {
  111.                 if (!graf_watchbox(ptree, selected_object, ctl->select_state, ob_state)) {
  112.                     exit_condition = FALSE;
  113.                     selected_object = NO_OBJECT;
  114.                 }
  115.             }
  116.         }
  117.     
  118.         if (xm.mwhich & MU_KEYBD && (xm.mkreturn & 0x00FF) == '\r') {
  119.             selected_object = ctl->defaultobj;
  120.             exit_condition  = TRUE;
  121.             obj_stchange(ptree, selected_object, ctl->select_state,
  122.                 OBJ_CLIPDRAW, ctl->pboundrect);
  123.         }
  124.  
  125.         if ((ctl->options & FRM_DMUSTSELECT) && selected_object == NO_OBJECT) {
  126.             exit_condition = FALSE;
  127.         }
  128.  
  129.     } while (!exit_condition);
  130.  
  131.     wind_update(END_MCTRL);
  132.  
  133.     return selected_object;
  134. }
  135.  
  136. static int find_default_exit(ptree)
  137.     register OBJECT *ptree;
  138. {
  139.     register int    counter = 0;
  140.     
  141.     for (;;) {
  142.         if (ptree->ob_flags & DEFAULT) {
  143.             return counter;
  144.         }
  145.         if (ptree->ob_flags & LASTOB) {
  146.             return NO_OBJECT;
  147.         }
  148.         ++ptree;
  149.         ++counter;
  150.     }
  151. }
  152.  
  153. int frm_menu(options, ptree, select_state)
  154.     long            options;
  155.     register OBJECT *ptree;
  156.     int             select_state;
  157. {
  158.     FormControl     ctl;
  159.     int             selobj;
  160.     long            actions;
  161.  
  162.     if (0 == (actions = options & FRM_ACTIONBITS)) {
  163.         options  |= (actions = FRM_DCOMPLETE);
  164.     }
  165.  
  166.     if (actions == FRM_DCOMPLETE) {
  167.         wind_update(BEG_UPDATE);
  168.         wind_update(BEG_MCTRL);
  169.     } else {
  170.         if (options & BLITOPTIONS) {
  171.             options &= ~BLITOPTIONS;
  172.         }
  173.     }
  174.     
  175.     wait_buttonup();
  176.  
  177.     _FrmSetup(&ctl, options, ptree, NULL);
  178.     ctl.select_state = select_state;
  179.     ctl.form_do      = frm_mdo;
  180.     ctl.defaultobj   = find_default_exit(ptree);
  181.  
  182.     if (actions & FRM_DSTART) {
  183.         frm_start(&ctl);
  184.     }
  185.  
  186.     if (actions & FRM_DDRAW) {
  187.         frm_draw(&ctl, ROOT);
  188.     }
  189.  
  190.     if (actions & FRM_DDO) {
  191.         selobj = frm_do(&ctl, 0);
  192.     }
  193.  
  194.     if (actions & FRM_DFINISH) {
  195.         frm_finish(&ctl);
  196.     }
  197.  
  198.     frm_cleanup(&ctl);
  199.  
  200.     if (!(ptree[selobj].ob_flags & TOUCHEXIT)) {
  201.         wait_buttonup();
  202.     }
  203.     
  204.     if (actions == FRM_DCOMPLETE) {
  205.         wind_update(END_MCTRL);
  206.         wind_update(END_UPDATE);
  207.     }
  208.  
  209.     return selobj;
  210. }
  211.  
  212.  
  213.